/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package clientereligadora.tableModel;

/**
 *
 * @author leandro.aquino
 */

import clientereligadora.entidades.Medidor;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;

      
    
    public class MedidorTableModel extends AbstractTableModel {  
        
        DecimalFormat moedaFormat = new DecimalFormat("#####.00");
      
        /* Lista de recibos que representam as linhas. */  
        private List<Medidor> linhas;  
      
        /* Array de Strings com o nome das colunas. */  
        private String[] colunas = new String[] {  
                "ID","ID_REL","AWATTHR","BWATTHR","CWATTHR" ,"AVARHR","BVARHR","CVARHR","AVAHR","BVAHR","CVAHR",
                "AIRMS","BIRMS","CIRMS","AVRMS","BVRMS","CVRMS","FREQ","TEMP","INTERV","DATA",};  
      
      
        /* Cria um ReciboTableModel vazio. */  
        public MedidorTableModel() {  
            linhas = new ArrayList<Medidor>();  
        }  
      
        /* Cria um ReciboTableModel carregado com 
         * a lista de recibos especificada. */  
        public MedidorTableModel(List<Medidor> listaMedidor) {  
            linhas = new ArrayList<Medidor>(listaMedidor);  
        }  
      
      
        /* Retorna a quantidade de colunas. */  
        @Override  
        public int getColumnCount() {  
            // EstÃ¡ retornando o tamanho do array "colunas".  
            // Mas como o array Ã© fixo, vai sempre retornar 4.  
            return colunas.length;  
        }  
      
        /* Retorna a quantidade de linhas. */  
        @Override  
        public int getRowCount() {  
            // Retorna o tamanho da lista de recibos.  
            return linhas.size();  
        }  
      
        /*
         * Retorna o nome da coluna no Ã­ndice especificado. Este mÃ©todo Ã© usado
         * pela JTable para saber o texto do cabeÃ§alho.
         */
        @Override
        public String getColumnName(int columnIndex) {
            // Retorna o conteÃºdo do Array que possui o nome das colunas  
            // no Ã­ndice especificado.  
            return colunas[columnIndex];
        }

        ;  
      
        /* Retorna a classe dos elementos da coluna especificada. 
         * Este mÃ©todo Ã© usado pela JTable na hora de definir o editor da cÃ©lula. */  
        @Override
        public Class<?> getColumnClass(int columnIndex) {
            // Retorna a classe referente a coluna especificada.  
            // Aqui Ã© feito um switch para verificar qual Ã© a coluna  
            // e retornar o tipo adequado. As colunas sÃ£o as mesmas  
            // que foram especificadas no array "colunas".  
            switch (columnIndex) {

                case 0: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 1: //data lanÃ§amento [DATE] 
                    return int.class;

                case 2: // LanÃ§amento [STRING]  
                    return int.class;
                    
                case 3: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 4: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 5: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 6: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 7: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 8: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 9: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 10: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 11: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 12: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 13: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 14: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 15: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 16: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 17: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 18: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 19: // Primeira coluna Ã© Selcionada ou naum.  
                    return int.class;

                case 20: // Primeira coluna Ã© Selcionada ou naum.  
                    return Date.class;

                default:
                    // Se o Ã­ndice da coluna nÃ£o for vÃ¡lido, lanÃ§a um  
                    // IndexOutOfBoundsException (ExceÃ§Ã£o de Ã­ndice fora dos limites).  
                    // NÃ£o foi necessÃ¡rio verificar se o Ã­ndice da linha Ã© invÃ¡lido,  
                    // pois o prÃ³prio ArrayList lanÃ§a a exceÃ§Ã£o caso seja invÃ¡lido.  
                    throw new IndexOutOfBoundsException("columnIndex out of bounds");
            }
        }
      
        /* Retorna o valor da cÃ©lula especificada 
         * pelos Ã­ndices da linha e da coluna. */  
        @Override  
        public Object getValueAt(int rowIndex, int columnIndex) {  
            // Pega o recibo da linha especificada.  
            Medidor medidor = linhas.get(rowIndex);

            // Retorna o campo referente a coluna especificada.  
            // Aqui Ã© feito um switch para verificar qual Ã© a coluna  
            // e retornar o campo adequado. As colunas sÃ£o as mesmas  
            // que foram especificadas no array "colunas".  
            switch (columnIndex) {
                case 0: // Primeira coluna Ã© isSelected?.  
                    return medidor.getId();
                    
                case 1: // Primeira coluna Ã© a data de emissao  
                    return medidor.getId_religadora();
                    
                case 2: // Segunda coluna Ã© o lancamento[STRING]  
                    return medidor.getAWATTHR();
                    
                case 3: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getBWATTHR();

                case 4: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getCWATTHR();

                case 5: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getAVARHR();

                case 6: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getBVARHR();

                case 7: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getCVARHR();

                case 8: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getAVAHR();

                case 9: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getBVAHR();

                case 10: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getCVAHR();

                case 11: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getAIRMS();

                case 12: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getBIRMS();

                case 13: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getCIRMS();

                case 14: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getAVRMS();

                case 15: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getBVRMS();

                case 16: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getCVRMS();

                case 17: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getFREQ();

                case 18: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getTEMP();

                case 19: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getINTERV();

                case 20: // Primeira coluna Ã© Selcionada ou naum.  
                    return  medidor.getDatetime(); 
                    
                               
                default:
                    // Se o Ã­ndice da coluna nÃ£o for vÃ¡lido, lanÃ§a um  
                    // IndexOutOfBoundsException (ExceÃ§Ã£o de Ã­ndice fora dos limites).  
                    // NÃ£o foi necessÃ¡rio verificar se o Ã­ndice da linha Ã© invÃ¡lido,  
                    // pois o prÃ³prio ArrayList lanÃ§a a exceÃ§Ã£o caso seja invÃ¡lido.  
                    throw new IndexOutOfBoundsException("columnIndex out of bounds");
            }
        }
        
        
        
      
        /* Seta o valor da cÃ©lula especificada 
         * pelos Ã­ndices da linha e da coluna. 
         * Aqui ele estÃ¡ implementado para nÃ£o fazer nada, 
         * atÃ© porque este table model nÃ£o Ã© editÃ¡vel. */  
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {};  
      
        /* Retorna um valor booleano que define se a cÃ©lula em questÃ£o 
         * pode ser editada ou nÃ£o. 
         * Este mÃ©todo Ã© utilizado pela JTable na hora de definir o editor da cÃ©lula. 
         * Neste caso, estarÃ¡ sempre retornando false, nÃ£o permitindo que nenhuma 
         * cÃ©lula seja editada. */  
        @Override  
        public boolean isCellEditable(int rowIndex, int columnIndex) {  
            
            boolean value = false;
            
            if(columnIndex == 0){
                value = true;
            }
            
            return value;  
        }
        
        
      
      
        ////////////////////////////////////////////////////////////  
        // Os mÃ©todos declarados atÃ© aqui foram as implementaÃ§Ãµes //  
        // de TableModel, que sÃ£o continuamente utilizados        //  
        // pela JTable para definir seu comportamento,            //  
        // por isso o nome Table Model (Modelo da Tabela).        //  
        //                                                        //  
        // A partir de agora, os mÃ©todos criados serÃ£o            //  
        // particulares desta classe.                             //  
        ////////////////////////////////////////////////////////////  
      
      
        /* Retorna o recibo da linha especificada. */  
        public Medidor getDadosMedidor(int indiceLinha) {  
            return linhas.get(indiceLinha);  
        }  
          
        /* Adiciona um registro. */  
        public void addMedidor(Medidor Medidor) {  
            // Adiciona o registro.  
            linhas.add(Medidor);  
      
            // Pega a quantidade de registros e subtrai um para achar  
            // o Ãºltimo Ã­ndice. Ã‰ preciso subtrair um, pois os Ã­ndices  
            // comeÃ§am pelo zero.  
            int ultimoIndice = getRowCount() - 1;  
      
            // Reporta a mudanÃ§a. O JTable recebe a notificaÃ§Ã£o  
            // e se redesenha permitindo que visualizemos a atualizaÃ§Ã£o.  
            fireTableRowsInserted(ultimoIndice, ultimoIndice);  
        }  
      
        /* Remove a linha especificada. */  
        public void removeMedidor(int indiceLinha) {  
            // Remove o recibo da linha especificada.          
            linhas.remove(indiceLinha);  
      
            // Reporta a mudanÃ§a. O JTable recebe a notificaÃ§Ã£o  
            // e se redesenha permitindo que visualizemos a atualizaÃ§Ã£o.  
            fireTableRowsDeleted(indiceLinha, indiceLinha);  
        }  
      
        /* Adiciona uma lista de recibos ao final dos registros. */  
        public void addListaDeMedidor(List<Medidor> Medidor) {  
            // Pega o tamanho antigo da tabela.  
            int tamanhoAntigo = getRowCount();  
      
            // Adiciona os registros.  
            linhas.addAll(Medidor);  
      
            // Reporta a mudanÃ§a. O JTable recebe a notificaÃ§Ã£o  
            // e se redesenha permitindo que visualizemos a atualizaÃ§Ã£o.  
            fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);  
        }  
      
        /* Remove todos os registros. */  
        public void limpar() {  
            // Remove todos os elementos da lista de recibos.  
            linhas.clear();  
      
            // Reporta a mudanÃ§a. O JTable recebe a notificaÃ§Ã£o  
            // e se redesenha permitindo que visualizemos a atualizaÃ§Ã£o.  
            fireTableDataChanged();  
        }  
      
        /* Verifica se este table model estÃ¡ vazio. */  
        public boolean isEmpty() {  
            return linhas.isEmpty();  
        }  
      
    }  

